package main.Strategy;

import main.Fruit.Fruit;

import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;

/**
 * 策略抽象类
 */
public abstract class Strategy {
    /**
     * 默认计算策略（可重写）
     * @param fruits 要购买的水果列表
     * @return 总价格
     */
    public BigDecimal compute(List<Fruit> fruits) {
        BigDecimal sum = new BigDecimal("0.0");
        for(Fruit fruit : fruits) {
            sum = sum.add(fruit.getUnitPrice().multiply(new BigDecimal(fruit.getWeight())));
        }
        return sum;
    };

    /**
     * 求和（不可重写）
     * @param fruits 要购买的水果列表
     * @return 总价格
     */
    public final BigDecimal sum(List<Fruit> fruits) {
        BigDecimal totalPrice = new BigDecimal("0.0");
        if (Objects.isNull(fruits) || fruits.isEmpty()) return totalPrice;
        try {
            totalPrice = totalPrice.add(compute(fruits));
        } catch (Exception e) {
            throw new RuntimeException("策略配置出错:" + e.getMessage());
        }

        if (totalPrice.compareTo(new BigDecimal(0)) < 0) throw new RuntimeException("策略配置错误,总价不能小于等于0");

        return totalPrice;
    };
}
